#pragma once  //  头文件只展开一次

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
#include "driver/rmt.h"
#include <stdio.h>
#include "driver/gpio.h"
#include "esp_err.h"

#ifdef __cplusplus
extern "C" {
#endif

#define IR_RX_GPIO_NUM GPIO_NUM_4  // 红外接收引脚
#define RMT_RX_CHANNEL RMT_CHANNEL_0  // 使用RMT通道0

///////////////原配遥控器//////////////////
#define IR_POWER_KEY 0x00FF
#define IR_START_KEY 0x40BF
#define IR_TIME_ADD_KEY 0x20DF
#define IR_TIME_SUB_KEY 0x609F
#define IR_HEAT_ADD_KEY 0x10EF
#define IR_HEAT_SUB_KEY 0x50AF
#define IR_MODE_ADD_KEY 0x30CF
#define IR_MODE_SUB_KEY 0x708F
#define IR_STR_ADD_KEY 0x08F7
#define IR_STR_SUB_KEY 0x48B7

///////////////批量遥控器//////////////////
#define IR2_POWER_KEY 0xA25D
#define IR2_START_KEY 0xE21D
#define IR2_TIME_ADD_KEY 0x22DD
#define IR2_TIME_SUB_KEY 0xC23D
#define IR2_HEAT_ADD_KEY 0xE01F
#define IR2_HEAT_SUB_KEY 0x906F
#define IR2_MODE_ADD_KEY 0x6897
#define IR2_MODE_SUB_KEY 0xB04F
#define IR2_STR_ADD_KEY 0x30CF 
#define IR2_STR_SUB_KEY 0x7A85


typedef struct {
    uint16_t address;
    uint16_t command;
    bool repeat;
} ir_nec_data_t;

/**
 * @brief 初始化红外接收器
 * 
 * @return esp_err_t 返回ESP_OK表示成功
 */
esp_err_t ir_receiver_init();

/**
 * @brief 获取红外数据
 * 
 * @param data 存储红外数据的结构体指针
 * @param timeout_ticks 等待超时时间(以FreeRTOS ticks为单位)
 * @return true 成功获取数据
 * @return false 获取数据失败或超时
 */
bool ir_receiver_get_data(ir_nec_data_t *data, TickType_t timeout_ticks);

#ifdef __cplusplus
}
#endif

void Rmt_Task(void *args);
